/*
 * 重写Ext.form.ComboBox,可以是combox支持一维编码
 * 如果使用了codeName就自动到一维编码项里找对应的数据
 * 不使用codeName，就要联合使用dataUrl和dataFields
 * */
Ext.define('comboBox', {
	extend : 'Ext.form.ComboBox',
    loadingType:'database',//加载类型 database数据库 systemCoding系统编码
	codeName : null,
	dataUrl : null,
	dataFields : ['itemValue', 'itemText'], //保存值 显示的值
	forceSelection: true, //只允许从下拉列表中进行选择，不能输入文本
	queryMode: 'local', //remote从服务器获取数据，local本地获取数据
	initComponent : function() {
		if (this.codeName) {
            this.dataUrl =( this.loadingType=="database") ? "codeValueController/getCodeValue.action": "commonController/getCodeValue.action";
			this.valueField = 'itemValue';
            this.displayField = 'itemText';
		} else{
            this.valueField = this.dataFields[0];
            this.displayField = this.dataFields[1];
        }
        //这里主要是防止comboBox赋值的时候由于类型不一样而导致的不能选择对于的项
        var tempFields=[];
        for(var i in this.dataFields){
            tempFields.push({
                name : this.dataFields[i],
                type : 'string'
            })
        }
        //先判断是否使用了 getRootPath()方法
        var url=((this.dataUrl.indexOf('http://')>-1)?this.dataUrl:(getRootPath()+'/'+this.dataUrl));
        //再判断是否启用了路径
         url=((this.dataUrl.indexOf('../')>-1)?this.dataUrl:url);
		var dataStore = Ext.create('Ext.data.Store', {
            fields: tempFields,
					scope : this,
					proxy : {
						type : 'ajax',
						url : url,
						reader : {
							type : 'json',
							root : 'rows'
						}
					},
					listeners : {
						scope : this,
						'beforeload' : function(store, op, options) {
							var params = {
								// 参数
								codeName :escape(  this.codeName)
							};
							Ext.apply(store.proxy.extraParams, params);
						}, load : function(store, records, options ){
                             //支持选择空项
                            //可以使用Backspance来选择空项
                            store.insert(0,this.dataFields);
                        }
                    },
					autoLoad : false
				});
		dataStore.load({
					params : {
						codeName :escape(  this.codeName)
					}
				});
		this.store = dataStore;
		// 调用父类方法
		this.callParent(arguments);
	}
});



/*
 * 使用示例
 * Ext.create("comboBoxTree", {  
			        id : 'roleResource',  
			        name : 'roleResource',  
			        hiddenValue : '',
			        hiddenName : 'id',// 提交到后台的input的name ，对应下面store里的''id，必须要填
			        storeUrl : '../resourceController/getAllResource.action',  
			        cascade : 'both',//级联方式:1.child子级联;2.parent,父级联,3,both全部级联  
			      //  checkModel:'double',//当json数据为不带checked的数据时只配置为single,带checked配置为double为单选,不配置为多选  
			        width : 270,  
			        fieldLabel : '资源',  
			        allowBlank : true,
			        labelWidth : 60,  
			        rootId : 'root-0',  //后天添加数据的时候root不计算在呢
			        rootText : '全部',  
			        treeNodeParameter : ''
			    })
 * 
 * 	   //重新加载数据的方法
		//控件还没渲染不能直接picker.store.load();所以加个判断
		if(form.getForm().findField("pTreeCodeC").picker!=null)
		form.getForm().findField("pTreeCodeC").picker.store.load();
 * */
Ext.define("comboBoxTree", {
	extend : "Ext.form.field.Picker",
	requires : ["Ext.tree.Panel"],
	rootVisible : true,// 是否显示根节点
	singleParentSelect : true,// 在单选的时候所有父节点是否也能选择
	callback : Ext.emptyFn,
	initComponent : function() {
		var self = this;
		Ext.apply(self, {
					fieldLabel : self.fieldLabel,
					labelWidth : self.labelWidth
				});
		self.callParent();
	},
	createPicker : function() {
		var self = this;
		var varRoot;
		//如果是单选root不显示checked
		if (self.checkModel == 'single'){
			varRoot={
						id : self.rootId,
						text : self.rootText,
						expandable : true,
						expanded : true
					};
		}
		else
		{
			varRoot={
						id : self.rootId,
						text : self.rootText,
						checked : false,
						expandable : true,
						expanded : true
					};
		}
		var store = Ext.create('Ext.data.TreeStore', {
					proxy : {
						type : 'ajax',
						url : self.storeUrl
					},
					sorters : [{
								property : 'leaf',
								direction : 'ASC'
							}, {
								property : 'text',
								direction : 'ASC'
							}],
					root : varRoot,
					nodeparam : self.treeNodeParameter
				});
		self.picker = new Ext.tree.Panel({
					height : 300,
					autoScroll : true,
					floating : true,
					focusOnToFront : false,
					shadow : true,
					ownerCt : this.ownerCt,
					useArrows : true,
					store : store,
					rootVisible : self.rootVisible
				});
		self.picker.on({
			checkchange : function(record, checked) {
				var checkModel = self.checkModel;
				if (checkModel == 'double') {
					var root = self.picker.getRootNode();
					root.cascadeBy(function(node) {
								if (node.get('text') != record.get('text')) {
									node.set('checked', false);
								}
							});
					if (record.get('leaf') && checked) {
						self.setValue(record.get('text')); // 显示值
						self.hiddenValue = record.get('id');
						// 回调函数
						self.callback.call(this, record.join(';'), record
										.join(';'));
					} else {
						record.set('checked', false);
						self.setValue(''); // 显示值
						self.hiddenValue = '';
						self.callback.call(this, '', '');
					}
				} else {
					var cascade = self.cascade;
					if (checked == true) {
						if (cascade == 'both' || cascade == 'child'
								|| cascade == 'parent') {
							if (cascade == 'child' || cascade == 'both') {
								if (!record.get("leaf") && checked)
									record.cascadeBy(function(record) {
												record.set('checked', true);
											});
							}
							if (cascade == 'parent' || cascade == 'both') {
								pNode = record.parentNode;
								for (; pNode != null; pNode = pNode.parentNode) {
									pNode.set("checked", true);
								}
							}
						}
					} else if (checked == false) {
						if (cascade == 'both' || cascade == 'child'
								|| cascade == 'parent') {
							if (cascade == 'child' || cascade == 'both') {
								if (!record.get("leaf") && !checked)
									record.cascadeBy(function(record) {
												record.set('checked', false);
											});
							}

						}

					}
					var records = self.picker.getView().getChecked(), names = [], values = [];
					Ext.Array.each(records, function(rec) {
								names.push(rec.get('text'));
								values.push(rec.get('id'));
							});
					self.setValue(names.join(';')); // 显示值
					self.hiddenValue = values.join(';');// 隐藏值
					// 回调函数
					self.callback.call(this, values.join(';'), names.join(';'));

				}
			},
			itemclick : function(tree, record, item, index, e, options) {
				var checkModel = self.checkModel;

				if (checkModel == 'single') {
					if (self.singleParentSelect) {
						// 回调函数
						self.setValue(record.get('text')); // 显示值
						self.hiddenValue = record.get('id');
						self.callback.call(this, record.get('id'), record.get('text'));
					} else {
						if (record.get('leaf')) {
							self.setValue(record.get('text')); // 显示值
							self.hiddenValue = record.get('id');
							// self.setRawValue(record.get('id')); // 隐藏值
						} else {
							self.setValue(''); // 显示值
							self.hiddenValue = '';
							// self.setRawValue(''); // 隐藏值
						}
					}
				}

			}
		});
		return self.picker;
	},
	alignPicker : function() {
		var me = this, picker, isAbove, aboveSfx = '-above';
		if (this.isExpanded) {
			picker = me.getPicker();
			if (me.matchFieldWidth) {
				picker.setWidth(me.bodyEl.getWidth());
			}
			if (picker.isFloating()) {
				picker.alignTo(me.inputEl, "", me.pickerOffset); // ""->tl
				isAbove = picker.el.getY() < me.inputEl.getY();
				me.bodyEl[isAbove ? 'addCls' : 'removeCls'](me.openCls
						+ aboveSfx);
				picker.el[isAbove ? 'addCls' : 'removeCls'](picker.baseCls
						+ aboveSfx);
			}
		}
	}
});